Powershell scripts/Export a list of recommendations for all subscriptions/Get-All-ASC-Recommendations.ps1 (111 lines of code) (raw):
#######################################################################################
# This sample script enumerates through all your subscriptions you have access to #
# and creates a CSV file with all recommendations across your subscriptions #
# Prerequisites: #
# - Latest Az PowerShell module #
# - logged into to Azure (login-AzAccount) #
# - output folder and filename #
#######################################################################################
$ErrorActionPreference = 'Stop'
$outputFolder = "<Your Output Folder>" # use format "c:\temp"
$outputFileName = "ASC-Recommendations.csv"
$Subscriptions = Get-AzSubscription
$RecommendationTable = @()
$MissingSubscriptions = @()
#region check Az Module presence
Write-Host "Checking if you have installed the Azure module..." -ForeGroundColor Green
$AzModule = Get-Module -Name "Az.*" -ListAvailable
if ($AzModule -eq $null)
{
Write-Verbose "Azure PowerShell module not found"
# Check for Admin Privleges
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$isadmin = ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
if($isadmin -eq $False)
{
# No Admin, install to current user
Write-Warning -Message "Can not install Az Module. You are not running as Administrator"
Write-Warning -Message "Installing Az Module to Current User Scope"
Install-Module Az -Scope CurrentUser -Force
Install-Module Az.Security -Scope CurrentUser -Force
}
else
{
# Admin, install to all users
Install-Module Az -Force
Install-Module Az.Security -Force
}
else
{
if ($AzModule.Name -notcontains "Az.Security")
{
Write-Verbose "Azure Security PowerShell module not found"
if($isadmin -eq $False){
Write-Warning -Message "Can not install Az Security Module. You are not running as Administrator"
Write-Warning -Message "Installing Az Security Module to Current User Scope"
Install-Module Az.Security -Scope CurrentUser -Force
}
else
{
# Admin, install to all users
Install-Module Az.Security -Force
}
}
}
}
# Import Modules - uncomment if the modules are not loaded by default
#Import-Module Az
#Import-Module Az.Security
# Login to Azure - uncomment if you need to login
#Login-AzAccount
#endregion
Write-Host "Getting recommendations from your Azure subscriptions.....please by patient" -ForegroundColor Green
foreach($Subscription in $Subscriptions)
{
Select-AzSubscription $Subscription.Id
try
{
$SecurityTasks = Get-AzSecurityTask # get all recommendations from ASC
foreach($SecurityTask in $SecurityTasks)
{
If([string]::IsNullOrEmpty($SecurityTask.ResourceId.Split("/")[8])) {
# resource field is empty, do nothing, since this is not actionable
}
else {
$Recommendations = New-Object psobject -Property @{
Recommendation = $SecurityTask.RecommendationType
Resource = ($SecurityTask.ResourceId.Split("/")[8])
SubscriptionName = $Subscription.Name
SubscriptionId = ($SecurityTask.ResourceId.Split("/")[2])
ResourceGroup = ($SecurityTask.ResourceId.Split("/")[4])
}
$RecommendationTable += $Recommendations
}
}
}
catch
{
Write-Host "Could not get recommendations for subscription: " $Subscription.Name -ForegroundColor Red
Write-Host "Error Message: " $_.Exception.Message -ForeGroundColor Red
Write-Host "Skipping subscription `r`n" -ForegroundColor Red
$MissingSubscriptionsDetails = New-Object psobject -Property @{
SubscriptionName = $Subscription.Name
SubscriptionId = ($SecurityTask.ResourceId.Split("/")[2])
ErrorMessage = $_.Exception.Message
}
$MissingSubscriptions += $MissingSubscriptionsDetails
}
}
Write-Host "*** Creating Output file: " ($outputFolder + "\" + $outputFileName) "***" -ForegroundColor Green
try
{
$RecommendationTable | Select-Object "SubscriptionName", "SubscriptionId", "Resource", "Recommendation", "ResourceGroup" | Export-Csv -Path ($outputFolder + "\" + $outputFileName) -Force -NoTypeInformation
Write-Host "Done! `r`n" -ForegroundColor Yellow
}
catch {Write-Host "Could not create output file.... Please check your path, filename and write permissions." -ForeGroundColor Red}
# list missing subscriptions, in case we could not get recommendations for a certain subscription due to an error
if($MissingSubscriptions -ne $null)
{
Write-Host "Recommendations for the following subscriptions could not be retrieved:" -ForegroundColor Red
$MissingSubscriptions
}